// 题目：
//    将 1,2,…,9 共 9个数分成三组，分别组成三个三位数，且这三个数的比例是1:2:3，求出所有可能的解。
// 一个例子：
//    192  384  576

#include <iostream>

/* @brief 检查某个数字是否已经被占用
*
*  @param digit 被检查的数字
*  @param flags 标志数组，长度为10，代表0~9这10个数字是否被使用
*
*  @return 如果被检查的数字被占用，返回true;
           如果没有使用，返回false，bing更新对应的flags为true，该数字后面不能再用
*/
bool is_digit_used(int digit, bool flags[]) {
  if (flags[digit]) return true;
  flags[digit] = true;
  return false;
}

/* @brief 检查某个数是否有效(该数的各位数在flags标志数组中都不能被使用)
*
*  @param  num 被检查的数
*  @param flags 标志数组，长度为10，代表0~9这10个数字是否被使用
*
*  @return 如果被检查的数有效，返回true;
           如果被检查的数无效，返回false
*/
bool is_num_valid(int num, bool flags[]) {
  if (num >= 1000) return false; // 只能是3位数
  while (num > 0) {
    int digit = num % 10;
    if (is_digit_used(digit, flags)) return false;
    num /= 10;
  }
  return true;
}

int main(int argc, char** argv) {
    // 枚举数a的百位十位个位，得到备选数a
  for (size_t i = 1; i <= 3; i++) { // a的百位不能>=4, 否则c肯定超过1000，不是3位数
    for (size_t j = 1; j <= 9; j++) {
      if (j == i) continue;  // 跳过重复情况
      for (size_t k = 1; k <= 9; k++) {
        if (k == j || k == i) continue; // 跳过重复情况
        int a = i * 100 + j * 10 + k;

        // 根据备选数a，推出b和c
        int b = a * 2;
        int c = a * 3;

        bool flags[10] = {false}; // 表示0~9这十个数字是否被使用
        flags[0] = true; // 不能使用数字0，总是true
        flags[i] = true;
        flags[j] = true;
        flags[k] = true;

        // 检测生成的 b 和 c 是否符合要求
        //  这里使用了一个 bool数组作为各个数字的标记
        if (!is_num_valid(b, flags)) continue;
        if (!is_num_valid(c, flags)) continue;

        std::cout << a << " " << b << " " << c << std::endl;
      }
    }
  }

  return 0;
}